package com.wenx.v3system.modular.cloud.service;

import java.util.List;
import java.util.Set;

/**
 * 系统用户权限服务接口
 * 基于Enhanced RBAC权限模型重构
 * 使用v3-system数据源
 * 
 * @author wenx
 */
public interface SysUserPermissionService {

    /**
     * 获取用户的所有权限代码
     * 包括直接权限和通过角色获得的权限
     * 
     * @param userId 用户ID
     * @return 权限代码集合
     */
    Set<String> getUserPermissions(Long userId);

    /**
     * 获取用户的所有角色ID
     * 
     * @param userId 用户ID
     * @return 角色ID集合
     */
    Set<Long> getUserRoles(Long userId);

    /**
     * 检查用户是否拥有指定权限
     * 
     * @param userId 用户ID
     * @param permission 权限代码
     * @return 是否拥有权限
     */
    boolean hasPermission(Long userId, String permission);

    /**
     * 检查用户是否拥有任一权限（OR逻辑）
     * 
     * @param userId 用户ID
     * @param permissions 权限代码数组
     * @return 是否拥有任一权限
     */
    boolean hasAnyPermission(Long userId, String... permissions);

    /**
     * 检查用户是否拥有所有权限（AND逻辑）
     * 
     * @param userId 用户ID
     * @param permissions 权限代码数组
     * @return 是否拥有所有权限
     */
    boolean hasAllPermissions(Long userId, String... permissions);

    /**
     * 获取用户可访问的菜单ID集合
     * 
     * @param userId 用户ID
     * @return 菜单ID集合
     */
    Set<Long> getUserMenus(Long userId);

    /**
     * 为用户分配角色
     * 
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     */
    void assignRolesToUser(Long userId, List<Long> roleIds);

    /**
     * 移除用户的角色
     * 
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     */
    void removeUserRoles(Long userId, List<Long> roleIds);

    /**
     * 获取用户在指定部门下的权限
     * 
     * @param userId 用户ID
     * @param departmentId 部门ID
     * @return 权限代码集合
     */
    Set<String> getUserPermissionsByDepartment(Long userId, Long departmentId);

    /**
     * 检查用户在指定部门下是否拥有权限
     * 
     * @param userId 用户ID
     * @param departmentId 部门ID
     * @param permission 权限代码
     * @return 是否拥有权限
     */
    boolean hasPermissionInDepartment(Long userId, Long departmentId, String permission);
    /**
     * 清除用户权限缓存
     * 
     * @param userId 用户ID
     */
    void clearUserPermissionCache(Long userId);

    /**
     * 清除所有用户权限缓存
     */
    void clearAllPermissionCache();
}